home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / graphics / dobbs_ex.1 < prev    next >
Text File  |  1989-08-23  |  7KB  |  287 lines

  1. Path: xanth!lll-winken!ames!sun-barr!newstop!sun!swap!page
  2. From: page%swap@Sun.COM (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i173:  dobbs-examples - from dr. dobbs july 89 article
  5. Message-ID: <123144@sun.Eng.Sun.COM>
  6. Date: 23 Aug 89 06:55:35 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 276
  9. Approved: page@sun.com
  10.  
  11. Submitted-by: cmcmanis@Eng.Sun.COM (Chuck McManis)
  12. Posting-number: Volume 89, Issue 173
  13. Archive-name: graphics/dobbs-ex.1
  14.  
  15. These are the sources for the two examples in the July '89 Dr. Dobbs
  16. article "Multitasking OS and Graphics Co-processors".
  17.  
  18. # This is a shell archive.
  19. # Remove anything above and including the cut line.
  20. # Then run the rest of the file through 'sh'.
  21. # Unpacked files will be owned by you and have default permissions.
  22. #----cut here-----cut here-----cut here-----cut here----#
  23. #!/bin/sh
  24. # shar: SHell ARchive
  25. # Run the following text through 'sh' to create:
  26. #    README
  27. #    blit.c
  28. #    dualvp.c
  29. # This is archive 1 of a 1-part kit.
  30. # This archive created: Tue Aug 22 23:55:07 1989
  31. echo "extracting README"
  32. sed 's/^X//' << \SHAR_EOF > README
  33. XThese are the sources for the two examples in the Dr. Dobbs article
  34. X"Multitasking OS and Graphics Co-processors". This article appears in 
  35. Xthe July 1989 issue. 
  36. X
  37. X--Chuck McManis
  38. Xuucp: {anywhere}!sun!cmcmanis   BIX: cmcmanis  ARPAnet: cmcmanis@sun.com
  39. XThese opinions are my own and no one elses, but you knew that didn't you.
  40. SHAR_EOF
  41. echo "extracting blit.c"
  42. sed 's/^X//' << \SHAR_EOF > blit.c
  43. X/*
  44. X *    blit.c - Demonstrates the benefit of the blitter.
  45. X *
  46. X *    Written 4/9/89 by C. McManis using Lattice C 5.02
  47. X *    
  48. X *    The difference on my machine between waiting for the blitter
  49. X *    to complete before calculating the next set of draw parameters
  50. X *    is 1.6 vs 1.4 seconds, about a 12.5% increase in speed.
  51. X */
  52. X
  53. X#include <exec/types.h>
  54. X#include <exec/memory.h>
  55. X#include <intuition/intuition.h>
  56. X#include <graphics/gfx.h>
  57. X
  58. Xextern struct IntuitionBase *IntuitionBase;
  59. Xextern struct GfxBase        *GfxBase;
  60. X
  61. X
  62. Xstruct NewScreen NS = {
  63. X        0, 0,        /* Position on the display          */
  64. X        320, 200, 4,    /* Attributes (Width, Height, Depth) */
  65. X        1,0,        /* Detail and Block pens         */
  66. X        0,        /* ViewModes nothing special         */
  67. X        CUSTOMSCREEN,    /* It is our own screen we want         */
  68. X        0,        /* Using the Default font         */
  69. X        "Blitter Test",    /* With a simple title.             */
  70. X        0,        /* No special gadgets             */
  71. X        0        /* And no special bitmap         */
  72. X    };
  73. Xstruct Screen    *MyScreen;
  74. Xstruct RastPort    *RPort;
  75. X
  76. Xvoid
  77. Xcleanup(n)
  78. X    int    n;
  79. X{
  80. X    if (GfxBase) 
  81. X        CloseLibrary(GfxBase);
  82. X
  83. X    if (MyScreen)
  84. X        CloseScreen(MyScreen);
  85. X
  86. X    if (IntuitionBase)
  87. X        CloseLibrary(IntuitionBase);
  88. X    exit(n);
  89. X}
  90. X    
  91. Xvoid
  92. Xmain()
  93. X{
  94. X
  95. X
  96. X    int    i,     /* Loop counter */
  97. X        x, y, c, /* some random draw parameters */
  98. X        t0[2],     /* Start Time */
  99. X        t1[2];     /* End time */
  100. X
  101. X    IntuitionBase = (struct IntuitionBase *)
  102. X                OpenLibrary("intuition.library",0L);
  103. X    if (! IntuitionBase) 
  104. X        cleanup(1);
  105. X
  106. X    GfxBase = (struct GfxBase *)
  107. X                OpenLibrary("graphics.library", 0L);
  108. X    if (! GfxBase)
  109. X        cleanup(1);
  110. X
  111. X
  112. X    /* This does all of the view construction for us */
  113. X
  114. X    MyScreen = (struct Screen *) OpenScreen(&NS);
  115. X    
  116. X    if (!MyScreen) 
  117. X        cleanup(1);
  118. X
  119. X    timer(t0);    /* Start the clock running */
  120. X
  121. X    /* Get the RastPort of this screen */
  122. X    RPort = &(MyScreen->RastPort);
  123. X
  124. X    SetAPen(RPort, 1);        /* Foreground pen = 1 */
  125. X    SetBPen(RPort, 0);        /* Background pen = 0 */
  126. X
  127. X    srand(42);            /* set the seed */
  128. X    Move(RPort, 160, 100);         /* Move to the moiddle of the screen */  
  129. X
  130. X    /*
  131. X     * Note we generate psuedo random numbers (eg the same set of 
  132. X      * random numbers every time.
  133. X     */
  134. X    for (i=0; i<100000; i++) {
  135. X        x = (rand() % 300) + 10;
  136. X        y = (rand() % 180) + 10;
  137. X        c = rand() % 16;
  138. X        SetAPen(RPort, c);
  139. X        Draw(RPort, x, y);
  140. X#ifdef WAIT_BLIT
  141. X        WaitBlit();    /* Simulate non-coprocessor */
  142. X#endif
  143. X    }
  144. X
  145. X    timer(t1);    /* stop the clock */
  146. X
  147. X#ifdef WAIT_BLIT
  148. X    printf("With waiting for the blitter, we took %d microseconds.\n",
  149. X            (t1[0] - t0[0]) * 1000000 + (t1[1] - t0[1]));
  150. X#else
  151. X    printf("Without waiting for the blitter, we took %d microseconds.\n",
  152. X            (t1[0] - t0[0]) * 1000000 + (t1[1] - t0[1]));
  153. X#endif        
  154. X        
  155. X    cleanup(0);
  156. X}
  157. SHAR_EOF
  158. echo "extracting dualvp.c"
  159. sed 's/^X//' << \SHAR_EOF > dualvp.c
  160. X/* 
  161. X *    dualvp.c - Dual Viewports on the amiga
  162. X *    Written 4/4/89 by C. McManis using Lattice C 5.02
  163. X */
  164. X
  165. X#include <exec/types.h>
  166. X#include <exec/memory.h>
  167. X#include <graphics/gfx.h>
  168. X#include <graphics/view.h>
  169. X#include <graphics/gfxbase.h>
  170. X#include <graphics/rastport.h>
  171. X
  172. Xextern struct GfxBase *GfxBase;
  173. X
  174. Xchar    *TextString = "Amiga Graphics Example";
  175. X
  176. X            /* Viewport 0 colors */
  177. XUWORD            colors0[4] = {0xccc, 0x000, 0x0f0, 0x00f},
  178. X            /* Viewport 1 colors */
  179. X            colors1[4] = {0x0f0, 0xc0c, 0xf00, 0xfff};
  180. Xvoid
  181. X_main()
  182. X{
  183. X    struct View    MyView, *OldView;
  184. X    struct ViewPort    Vp0, Vp1;
  185. X    struct BitMap    Bits;
  186. X    struct RasInfo    MyRaster;
  187. X        struct RastPort    rp;
  188. X    int        i;
  189. X
  190. X    /* Open the resident graphics library */
  191. X    GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L);
  192. X    if (!GfxBase) 
  193. X        exit(1);
  194. X
  195. X    OldView = GfxBase->ActiView; /* Save this away */
  196. X
  197. X    /* Initialize the View structures */
  198. X    InitView(&MyView);
  199. X    InitVPort(&Vp0);
  200. X    InitVPort(&Vp1);
  201. X
  202. X    Vp1.Next = NULL;
  203. X    Vp0.Next = &Vp1;    /* create a linked list of viewports */
  204. X    MyView.ViewPort = &Vp0;    /* With the first one being Vp0 */
  205. X
  206. X    /* Set up some display memory */
  207. X
  208. X    InitBitMap(&Bits, 2, 640, 200); 
  209. X    Bits.Planes[0] = (PLANEPTR)
  210. X             AllocMem(2*RASSIZE(640, 200),MEMF_CHIP+MEMF_CLEAR);
  211. X    Bits.Planes[1] = Bits.Planes[0] + RASSIZE(640, 200);
  212. X    if (!Bits.Planes[0]) 
  213. X        goto cleanup;
  214. X
  215. X    MyRaster.BitMap = &Bits;
  216. X    MyRaster.RxOffset = 0;
  217. X    MyRaster.RyOffset = 0;
  218. X    MyRaster.Next = NULL;
  219. X
  220. X    /* Both viewports are looking at the same display memory but have
  221. X         * different sets of colors
  222. X     */
  223. X
  224. X    Vp0.RasInfo = &MyRaster;
  225. X    Vp0.DWidth  = 320;
  226. X    Vp0.DHeight = 175;
  227. X    Vp0.ColorMap = (struct ColorMap *)GetColorMap(4);
  228. X    LoadRGB4(&Vp0, colors0, 4);
  229. X    
  230. X    Vp1.RasInfo = &MyRaster;
  231. X    Vp1.DWidth  = 640;
  232. X    Vp1.DHeight = 20;
  233. X    Vp1.DyOffset = 179;
  234. X    Vp1.Modes   = HIRES;
  235. X    Vp1.ColorMap = (struct ColorMap *)GetColorMap(4);
  236. X    LoadRGB4(&Vp1, colors1, 4);
  237. X
  238. X    
  239. X    /* Initialize a RastPort so that we can draw into that memory. */
  240. X    InitRastPort(&rp);
  241. X    rp.BitMap = &Bits;
  242. X    SetAPen(&rp, 1);    /* Foreground color */
  243. X    SetBPen(&rp, 0);    /* Background color */
  244. X    Move(&rp, 3, 12);    /* Move the graphics cursor to (3, 12) */
  245. X    /* Write something */
  246. X    Text(&rp, TextString, strlen(TextString));
  247. X    
  248. X    MakeVPort(&MyView, &Vp0); /* Build the copper list for Viewport 0 */
  249. X    MakeVPort(&MyView, &Vp1); /* Build the copper list for Viewport 1 */
  250. X    MrgCop(&MyView);       /* Merge it into the final list */
  251. X
  252. X    LoadView(&MyView);      /* Show it off */
  253. X
  254. X    /* SPIN FOR A WHILE */
  255. X    for (i=0; i<1000000; i++)
  256. X        ;
  257. X
  258. X    LoadView(OldView);       /* Return to the old view */
  259. X
  260. X    
  261. Xcleanup:
  262. X    /* Now give back the memory other tasks may need it */
  263. X
  264. X    if (!Vp0.ColorMap)
  265. X        FreeColorMap(Vp0.ColorMap);
  266. X
  267. X    if (!Vp1.ColorMap)
  268. X        FreeColorMap(Vp1.ColorMap);
  269. X
  270. X    FreeVPortCopLists(&Vp0);
  271. X    FreeVPortCopLists(&Vp1);
  272. X    FreeCprList(MyView.LOFCprList);
  273. X
  274. X
  275. X    if (!Bits.Planes[0]) 
  276. X        FreeMem(Bits.Planes[0], 2*RASSIZE(640, 200));
  277. X
  278. X    if (!GfxBase) 
  279. X        CloseLibrary(GfxBase);
  280. X
  281. X    exit(0);
  282. X}
  283. SHAR_EOF
  284. echo "End of archive 1 (of 1)"
  285. # if you want to concatenate archives, remove anything after this line
  286. exit
  287.